package com.leetcodehot.problems;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

public class problems1170 {
    /**
     * 定义一个函数 f(s)，统计 s  中（按字典序比较）最小字母的出现频次 ，其中 s 是一个非空字符串。
     * <p>
     * 例如，若 s = "dcce"，那么 f(s) = 2，因为字典序最小字母是 "c"，它出现了 2 次。
     * <p>
     * 现在，给你两个字符串数组待查表 queries 和词汇表 words 。对于每次查询 queries[i] ，需统计 words 中满足 f(queries[i]) < f(W) 的 词的数目 ，W 表示词汇表 words 中的每个词。
     * <p>
     * 请你返回一个整数数组 answer 作为答案，其中每个 answer[i] 是第 i 次查询的结果。
     */
    private int f(String word) {
        char[] charArray = word.toCharArray();
        Map<Character, Integer> map = new HashMap<>();
        Character min = 'z' + 1;
        for (char c : charArray) {
            map.put(c, map.getOrDefault(c, 0) + 1);
            if (c < min) {
                min = c;
            }
        }
        return map.get(min);
    }

    public int[] numSmallerByFrequency(String[] queries, String[] words) {
        int n = queries.length;
        int m = words.length;
        int[] res = new int[n];
        int[] wordCount = new int[m];
        for (int i = 0; i < m; i++) {
            wordCount[i] = f(words[i]);
        }
        //从小到大排序
        Arrays.sort(wordCount);

        for (int i = 0; i < n; i++) {
            String query = queries[i];
            int target = f(query);
            int left = -1;
            int right = m;
            while (left + 1 < right) {
                int mid = left + (right - left) / 2;
                if (wordCount[mid] <= target) {
                    left = mid;
                } else {
                    right = mid;
                }
            }//right
            res[i] = m - right;
        }
        return res;
    }
}
